#include "compile_run.hpp"
#include "../comm/httplib.h"

using namespace ns_compile_and_run;
using namespace httplib;

// 编译服务可能随时被多人请求，必须保证传递上来的code，形成源文件名称的时候，
// 要具有唯一性，不然多个用户之间会相互影响

void Usage(std::string proc)
{
    std::cerr << "Usage: " << "\n\t" << proc << std::endl;
}

//./compile_server port
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        Usage(argv[0]);
        return 1;
    }
    Server svr; // 创建一个 Server 对象 svr

    // 注册 GET 请求处理器(测试)
    // svr.Get("/hello",[](const Request &req, Response &resp){
    //     // 当收到 GET 请求到 "/hello" 时，设置响应内容
    //     resp.set_content("hello http!!你好","text/plain;charset=utf-8");
    // });

    // 注册 POST 请求处理器(只是设置好回调函数，当有请求来的时候才会执行)
    svr.Post("/compile_and_run", [](const Request &req, Response &resp)
             {
        // 用户请求的服务正文是我们想要的 JSON 字符串
        std::string in_json = req.body; // 获取请求体中的 JSON 字符串(表示请求的主体内容)
        std::string out_json; // 用于存储响应的 JSON 字符串

        // 如果输入 JSON 字符串不为空
        if (!in_json.empty())
        {
            // 调用 CompileAndRun::Start 函数进行编译和运行
            CompileAndRun::Start(in_json, &out_json);
            // 设置响应内容为输出的 JSON 字符串
            resp.set_content(out_json, "application/json;charset=utf-8");
        } });

    // 启动 HTTP 服务，监听所有地址的argv[1]端口
    svr.listen("0.0.0.0", atoi(argv[1])); // 启动 HTTP 服务
    // listen
    // 用于启动服务器并开始监听指定地址和端口的客户端请求。
    // 它使得服务器能够接收和处理来自客户端的连接。
    return 0; // 返回 0，表示程序正常结束
}
